import cv2 as cv
import numpy as np

# -------------------------shitomasi角检测------------------------------
# 比 Harris 角检测更加精确，以及更好用

img = cv.imread('2.jpg')

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)  # 灰度化

# 角点检测
corners = cv.goodFeaturesToTrack(gray, 1000, 0.01, 10)
# 参数说明：
# 1. gray：灰度图像
# 2. 最大检测角点数，如果检测到的角点超过此值，将按质量排序后返回前 maxCorners 个角点
# 3. qualityLevel:角点质量的最低阈值。所有质量低于 qualityLevel × 最高角点质量 的角点会被丢弃,0.01-0.1 之间较常用
# 4. minDistance:两个角点之间的最小距离，如果两个角点之间的距离小于此值，则被视为同一个角点。通常为 5-20 像素，取决于角点密度
# 返回值：float类型

corners = np.intp(corners)  # 转换为整数

# 绘制角点
for i in corners:
    x, y = i.ravel()
    cv.circle(img, (x, y), 3, (0,0,255), -1)

cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()